package br.ufrn.cerescaico.sepe.beans;

import br.ufrn.cerescaico.sepe.util.Constantes;
import br.ufrn.cerescaico.sepe.util.DatasPorExtenso;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;

/**
 * Universidade Federal do Rio Grande do Norte
 * Cidade: Caicó - RN
 *
 * <br>
 * 
 * Classe que representa um participante do evento pertencente ao sistema.
 *  
 * <br>
 * @author  Taciano Morais Silva, tacianosilva@gmail.com <br>
 * @version 17/08/2010, 20:27
 * @since 17/08/2010, 20:27
 *
 * Copyright (C) 2010
 */
@Entity
@Table(name = "participante")
public class Participante implements Bean, Serializable {

    /**
     * Identificador do participante.
     */
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    // Dados de autenticação no sistema
    /**
     * E-mail do participante.
     */
    @Column(name = "email", length = 100, nullable = false, unique = true)
    private String email;

    @Column(name = "senha", nullable = false)
    private String senha;
    // Dados pessoais

    @Column(name = "nome")
    private String nome;

    @Column(name = "nomeCracha")
    private String nomeCracha;

    @Column(name = "rua")
    private String rua;

    @Column(name = "numero")
    private String numero;

    @Column(name = "complemento")
    private String complemento;

    @Column(name = "bairro")
    private String bairro;

    @Column(name = "cep")
    private String cep;

    @Column(name = "cidade")
    private String cidade;

    @Column(name = "estado")
    private String estado;

    @Column(name = "telefone")
    private String telefone;

    @Column(name = "celular")
    private String celular;
    // Dados acadêmicos
    @Column(name = "curso")
    private String curso;

    @Column(name = "instituicao")
    private String instituicao;

    @Column(name = "titulacao")
    private String titulacao;

    @Column(name = "status")
    private String status;

    @Column(name = "categoria")
    private String categoria;
    // Cursos
    //private Atividade grupo1;
    //private Atividade grupo2;
    //private Atividade grupo3;
    //Trabalho
    //private List<Trabalho> trabalhos;
    // Dados do cadastro
    @Column(name = "dataCadastro")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCadastro; // data em que foi realizada a inscrição
    // Dados do usuário que efetuou a inscrição (presencial)
   // private Usuario usuario;
    // Pagamento
    private String status_pagamento;
    private int pagouExtra;
    private boolean possuiCursos;
    private boolean possuiTrabalhos;
    private boolean possuiResumosAceitos;
    private boolean possuiTrabalhosAceitos;
    private boolean possuiResumosAceitosNotificados;
    private boolean possuiTrabalhosAceitosNotificados;

    public Participante() {
        super();
        this.email = "";
        this.senha = "";

        // Dados pessoais
        this.nome = "";
        this.nomeCracha = "";
        this.rua = "";
        this.numero = "";
        this.complemento = "";
        this.bairro = "";
        this.cep = "";
        this.cidade = "";
        this.estado = "";
        this.telefone = "";
        this.celular = "";

        // Dados acadêmicos
        this.curso = "";
        this.instituicao = "";
        this.titulacao = "";
        this.status = "";
        this.categoria = "";

        // Dados do cadastro
        this.dataCadastro = null; // data em que foi realizada a inscrição

        // Dados do usuário que efetuou a inscrição (presencial)
       // this.usuario = null;

        // Pagamento
        this.pagouExtra = 0;

        //trabalhos = new ArrayList<Trabalho>();
        setStatus_pagamento(Constantes.PAGAMENTO_NAO_CADASTRADO);
        setPossuiCursos(false);
        setPossuiTrabalhos(false);
    }

    @Override
    public Integer getId() {
        return id;
    }

    @Override
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * @hibernate.property length="50"
     */
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @hibernate.property length="20"
     */
    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    /**
     * @hibernate.property length="200"
     */
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @hibernate.property length="25"
     */
    public String getNomeCracha() {
        return nomeCracha;
    }

    public void setNomeCracha(String nomeCracha) {
        this.nomeCracha = nomeCracha;
    }

    /**
     * @hibernate.property length="200"
     */
    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

    /**
     * @hibernate.property length="10"
     */
    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    /**
     * @hibernate.property length="50"
     */
    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    /**
     * @hibernate.property length="50"
     */
    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    /**
     * @hibernate.property length="8"
     */
    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    /**
     * @hibernate.property length="50"
     */
    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    /**
     * @hibernate.property length="2"
     */
    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    /**
     * @hibernate.property length="25"
     */
    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    /**
     * @hibernate.property length="25"
     */
    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    /**
     * @hibernate.property length="20"
     */
    public String getCurso() {
        return curso;
    }

    public void setCurso(String curso) {
        this.curso = curso;
    }

    /**
     * @hibernate.property length="100"
     */
    public String getInstituicao() {
        return instituicao;
    }

    public void setInstituicao(String instituicao) {
        this.instituicao = instituicao;
    }

    /**
     * @hibernate.property length="15"
     */
    public String getTitulacao() {
        return titulacao;
    }

    public void setTitulacao(String titulacao) {
        this.titulacao = titulacao;
    }

    /**
     * @hibernate.property length="10"
     */
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * @hibernate.property length="20"
     */
    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    /**
     * @hibernate.many-to-one
     */
   // public Atividade getGrupo1() {
    //    return grupo1;
   // }

 //   public void setGrupo1(Atividade grupo1) {
  //      this.grupo1 = grupo1;
  //  }

    /**
     * @hibernate.many-to-one
     */
 //   public Atividade getGrupo2() {
 //       return grupo2;
 //   }

  //  public void setGrupo2(Atividade grupo2) {
  //      this.grupo2 = grupo2;
  //  }

    /**
     * @hibernate.many-to-one
     */
  //  public Atividade getGrupo3() {
 //       return grupo3;
  //  }

  //  public void setGrupo3(Atividade grupo3) {
  //      this.grupo3 = grupo3;
  //  }

    /**
     * @hibernate.set role="trabalhos_participantes" table="trabalho_participante" readonly="true"
     * @hibernate.collection-key column="participanteID"
     * @hibernate.collection-many-to-many class="org.semac.beans.Trabalho" column="trabalhoID"
     */
    /*
    public List<Trabalho> getTrabalhos() {
        return trabalhos;
    }

    public void setTrabalhos(List<Trabalho> trabalhos) {
        this.trabalhos = trabalhos;
    }

    public void addTrabalho(Trabalho trabalho) {
        trabalhos.add(trabalho);
    }

    public void removeTrabalho(Trabalho trabalho) {
        trabalhos.remove(trabalho);
    }

    public Trabalho getTrabalho(int index) {
        Iterator iter = trabalhos.iterator();
        for (int i = 0; i < index; i++) {
            iter.next();
        }
        return ((Trabalho) iter.next());
    }*/

    /**
     * @hibernate.property
     */
    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    /**
     * @hibernate.many-to-one not-null="false"
     */
   // public Usuario getUsuario() {
  ////      return usuario;
   // }

  //  public void setUsuario(Usuario usuario) {
  //      this.usuario = usuario;
  //  }

    /**
     * @hibernate.property length="20"
     */
    public String getStatus_pagamento() {
        return status_pagamento;
    }

    public void setStatus_pagamento(String status_pagamento) {
        this.status_pagamento = status_pagamento;
    }

    /**
     * @hibernate.property
     */
    public int getPagouExtra() {
        return pagouExtra;
    }

    public void setPagouExtra(int pagouExtra) {
        this.pagouExtra = pagouExtra;
    }

    /**
     * Métodos para consulta de dados
     */
    public String getNomeCurso() {
        if (curso.equalsIgnoreCase(Constantes.PORTUGUES)) {
            return "Letras (L\u00edngua Portuguesa)";
        } else if (curso.equalsIgnoreCase(Constantes.ESPANHOL)) {
            return "Letras (L\u00edngua Espanhola)";
        } else if (curso.equalsIgnoreCase(Constantes.CONTABEIS)) {
            return "Ci\u00eancias Cont\u00E1beis";
        } else if (curso.equalsIgnoreCase(Constantes.MATEMATICA)) {
            return "Matem\u00E1tica";
        }
        return "Outro";
    }

    public String getNomeCategoria() {
        if (curso.equalsIgnoreCase(Constantes.CONGRESSISTA)) {
            return "Congressista";
        } else if (curso.equalsIgnoreCase(Constantes.CONVIDADO)) {
            return "Convidado";
        } else if (curso.equalsIgnoreCase(Constantes.PALESTRANTE)) {
            return "Palestrante";
        } else if (curso.equalsIgnoreCase(Constantes.COMISSAO_ORGANIZADORA)) {
            return "Organização";
        } else if (curso.equalsIgnoreCase(Constantes.EXPOSITOR)) {
            return "Expositor";
        } else if (curso.equalsIgnoreCase(Constantes.MONITOR)) {
            return "Monitor";
        }
        return "Outro";
    }

    public String getNomeStatus() {
        if (status.equalsIgnoreCase(Constantes.CURSANDO)) {
            return "Cursando";
        } else if (status.equalsIgnoreCase(Constantes.CONCLUIDO)) {
            return "Concluído";
        }
        return "Outro";
    }

    public String getNomeTitulacao() {
        if (titulacao.equalsIgnoreCase(Constantes.GRADUACAO)) {
            return "Graduação";
        } else if (titulacao.equalsIgnoreCase(Constantes.ESPECIALIZACAO)) {
            return "Especialização";
        } else if (titulacao.equalsIgnoreCase(Constantes.MESTRADO)) {
            return "Mestrado";
        } else if (titulacao.equalsIgnoreCase(Constantes.DOUTORADO)) {
            return "Doutorado";
        }
        return "Outro";

    }
/*
    public Collection getAllCursos() {
        Collection cursos = new Vector();
        if (getGrupo1() != null) {
            cursos.add(getGrupo1());
        }
        if (getGrupo2() != null) {
            cursos.add(getGrupo2());
        }
        if (getGrupo3() != null) {
            cursos.add(getGrupo3());
        }

        return cursos;
    }*/
/*
    public boolean getCursos() {
        if (getAllCursos().isEmpty()) {
            return false;
        }
        return true;
    }*/
/*
    public boolean getPossuiCursos() {
        if (getAllCursos().isEmpty()) {
            this.possuiCursos = false;
        } else {
            this.possuiCursos = true;
        }
        return possuiCursos;
    }*/

    public void setPossuiCursos(boolean possuiCursos) {
        this.possuiCursos = possuiCursos;
    }
/*
    public boolean getPossuiTrabalhos() {
        if (getTrabalhos().isEmpty()) {
            this.possuiTrabalhos = false;
        } else {
            this.possuiTrabalhos = true;
        }
        return possuiTrabalhos;
    }*/

    public void setPossuiTrabalhos(boolean possuiTrabalhos) {
        this.possuiTrabalhos = possuiTrabalhos;
    }
/*
    public boolean getPossuiResumosAceitos() {
        this.possuiResumosAceitos = false;
        Iterator it = getTrabalhos().iterator();
        while (it.hasNext()) {
            Trabalho t = (Trabalho) it.next();
            if (t.getStatusResumo().equals(Constantes.ACEITO)) {
                this.possuiResumosAceitos = true;
            }
        }
        return possuiResumosAceitos;
    }

    public boolean getPossuiResumosAceitosNotificados() {
        this.possuiResumosAceitosNotificados = false;
        Iterator it = getTrabalhos().iterator();
        while (it.hasNext()) {
            Trabalho t = (Trabalho) it.next();
            if (t.getStatusResumo().equals(Constantes.ACEITO)) {
                if (t.getEmailAceitacaoResumo()) {
                    this.possuiResumosAceitosNotificados = true;
                }
            }
        }
        return possuiResumosAceitosNotificados;
    }*/

    public void setPossuiResumosAceitos(boolean possuiTrabalhos) {
        this.possuiTrabalhos = possuiTrabalhos;
    }
/*
    public boolean getPossuiTrabalhosAceitos() {
        this.possuiTrabalhosAceitos = false;
        Iterator it = getTrabalhos().iterator();
        while (it.hasNext()) {
            Trabalho t = (Trabalho) it.next();
            if (t.getStatusTrabalho().equals(Constantes.ACEITO)) {
                this.possuiTrabalhosAceitos = true;
            }
        }
        return possuiTrabalhosAceitos;
    }*/
/*
    public boolean getPossuiTrabalhosAceitosNotificados() {
        this.possuiTrabalhosAceitosNotificados = false;
        Iterator it = getTrabalhos().iterator();
        while (it.hasNext()) {
            Trabalho t = (Trabalho) it.next();
            if (t.getStatusTrabalho().equals(Constantes.ACEITO)) {
                if (t.getEmailAceitacaoTrabalho()) {
                    this.possuiTrabalhosAceitosNotificados = true;
                }
            }
        }
        return possuiTrabalhosAceitosNotificados;
    }*/

    public void setPossuiTrabalhosAceitos(boolean possuiTrabalhos) {
        this.possuiTrabalhos = possuiTrabalhos;
    }

    public double getValorInscricao() {
        if (status.equals(Constantes.CURSANDO)) {
            return Constantes.VALOR_ESTUDANTE;
        } else if (status.equals(Constantes.CONCLUIDO)) {
            return Constantes.VALOR_PROFESSOR;
        }
        return Constantes.VALOR_PROFESSOR;
    }
/*
    public double getValorTotal() {
        double valorPago = 0.00;
        int cursos = getAllCursos().size();
        if (cursos > 0) {
            valorPago = getValorInscricao() + ((cursos - 1) * 5);
        } else {
            valorPago = getValorInscricao();
        }
        return valorPago;
    }*/

    public String getDataCadastroPorExtenso() {
        return DatasPorExtenso.getDataExtenso(getDataCadastro());
    }

    /* (non-Javadoc)
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    @Override
    public int compareTo(Object arg0) {
        Participante other = (Participante) arg0;
        return this.getEmail().compareTo(other.getEmail());
    }

    private static long diferenca(Date inicio, Date fim) {
        Calendar data_inicial = new GregorianCalendar();
        Calendar data_final = new GregorianCalendar();
        data_inicial.setTime(inicio);
        data_final.setTime(fim);
        long duracao = data_final.getTime().getTime() - data_inicial.getTime().getTime();
        return duracao;
    }
}
